'''
LangChain的最基本要求。
LangChain的很多价值在于将其与各种模型提供商、数据存储等进行集成

LangChain 提供了对几个主要模块:
模型（models） : LangChain 支持的各种模型类型和模型集成。

提示（prompts） : 包括提示管理、提示优化和提示序列化。

内存（memory） : 内存是在链/代理调用之间保持状态的概念。LangChain 提供了一个标准的内存接口、一组内存实现及使用内存的链/代理示例。

索引（indexes） : 与您自己的文本数据结合使用时，语言模型往往更加强大——此模块涵盖了执行此操作的最佳实践。

链（chains） : 链不仅仅是单个 LLM 调用，还包括一系列调用（无论是调用 LLM 还是不同的实用工具）。LangChain 提供了一种标准的链接口、许多与其他工具的集成。LangChain 提供了用于常见应用程序的端到端的链调用。

代理（agents） : 代理涉及 LLM 做出行动决策、执行该行动、查看一个观察结果，并重复该过程直到完成。LangChain 提供了一个标准的代理接口，一系列可供选择的代理，以及端到端代理的示例。
'''
'''
文档切片：它是一种处理大型文件或文档的方法，通常用于大数据环境中。
这种方法讲一个大的文档分割成过个较小的部分。这样做的好处可以并行处理这些切片，
提高数据处理效率，同时也方便数据的分布式存储。
    
1.文本分割的目的是为了更好地进行检索
    大模型提供了一个Embedding功能，可以将一段文字转换为一个多维信息的数组。
    当文本A和文本B的Embedding数组距离很接近时，代表文本A和文本B的意义相同或非常接近。
    这个特征可以为知识搜索提供非常大的便利。然而，文本不完整或者内容过多，就会影响匹配的精度。
    
2.分割可以对文档进行层次整理
'''

from langchain_community.document_loaders import UnstructuredFileLoader
# 旧版用法
# from langchain.document_loaders import UnstructuredFileLoader

from langchain.text_splitter import RecursiveCharacterTextSplitter

# 导入文本,UnstructuredFileLoader主要用于加载文件中未结构化的文本，
# 用于对未处理的文件进行一些预处理编码识别，
# 格式规范化等，确保文本数据识别接下来的预处理
# ，该函数可以用于读取txt文件，不能处理csv格式文件
# csv格式文件请使用langchain_community.document_loaders.csv_loader加载
loader = UnstructuredFileLoader("test.txt")
# 将文本转成 Document 对象
data = loader.load()
print(f'documents:{len(data)}')


# 初始化加载器
# chunk_size：切割的最长长度，该长度的单位是字符不是token长度
# chunk_overlap：切割的重叠长度
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(data)
print("split_docs size:",len(split_docs))
print(split_docs)
